package cn.tedu.shoppingmall.security;

import cn.tedu.shoppingmall.controller.AdminUserController;
import cn.tedu.shoppingmall.service.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
// 启动Spring-Security配置的注解

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 配置类要继承WebSecurityConfigurerAdapter
    // 这个父类提供了Spring-Security的标准配置方法
    // 我们在配置Spring-Security时直接重写它提供的方法即可
    // 下面的方法就是配置什么样的用户能够登录
    // 它能够代替application中配置的用户

    @Autowired
    private UserDetailsServiceImpl userDetailsService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 只有添加了下面代码之后,我们编写的UserDetailsServiceImpl中的实现类
        // 才会被Spring-Security使用
        auth.userDetailsService(userDetailsService);
    }

    // 设置页面权限的配置方法
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable() // 设置禁用防跨域攻击
            .authorizeRequests() // 开始设置页面的访问权限
                //指定路径
                .antMatchers(
                        "/indexCss.css","/favicon.ico",
                        "/admin/adminjs/*", //adminjs包里的
                        "/admin/Mall/indexMall.html",//商城首页
                        "/admin/selectToCommodity",//商城商品查询
                        "/admin/selectToCommodityLimit",//商城商品分页查询
                        "/admin/Mall/indexMallCls.html",//商城分类页
                        "/admin/selectToCommodityByClsid",//商城分类查询
                        "/admin/Mall/indexMallSearch.html",//商城搜索框查询
                        "/admin/selectToClass",//商城所有类查询
                        "/admin/CommoditySearch",//搜索商品
                        "/admin/admin/indexCss.css",//首页Css
                        "/admin/Mall/ComOne.html",//商品详情页
                        "/admin/Mall/**",//在商品详情页,点击登录后,会跳转到 /admin/Mall/评论标题内容 --此页404--->暂时还未解决
                                                    // ,虽然放行有风险,但是为了不影响体验感,先这样,等后期在处理
//                        "/admin/Mall/**",//商品详情页
                        "/admin/commoditySelectById",//商品详情页查询
                        "/2021/**",//放行url图片
                        "/2022/**",//放行url图片
                        "/admin/adminjs/bgfont.js",//放行背景js
                        "/login.html",
                        "/index.html",
                        "/admin/Mall/js/**", //header.js
                        "/moren.jpg", //默认用户头像
                        "/",
                        "/admin/img/**",
                        "/mall/getUser",//查询用户id
                        "/admin/adminLogin.html",
//                        "/admin/adminindex.html", //管理页面
                        "/admin/Info/**", //咨询页面
                        "/admin/selectToReportCls", //咨询页面类别查询
                        "/admin/selectToReportAll", //咨询页面内容查询
                        "/register.html",  // 注册页路径
                        "/mall/register",        // 注册控制器的路径
                        "/Santa.ico",        // 浏览器图标
                        "/Mall/favicon.ico",        // 浏览器图标
                        "/npm/**",        // 遗漏的瀑布流js
                        "/js/**" ,       //  遗漏的瀑布流js
                        "/resetpassword.html" ,       //  找回密码页面
                        "/admin/Mall/main.js" ,       //  element的js
                        "/admin/Mall/elment.css" ,       //  element的css
                        "/admin/commentSelectById" ,       //  商品评论
                        "/liyk.jpg",        //  微信图片
                        "/guo.jpg" ,       //  微信图片
                        "/user/**" ,       //  所有用户图片
                        "/admin/ShownumAdd/**"        //  浏览量
            ).permitAll() // 上面设置的路径全部放行(不需登录就能访问)
            .anyRequest() // 其他请求
            .authenticated()  // 需要登录才能访问
            .and()        // 是一个分割,表示上面的配置完毕,开始下面新的配置
            .formLogin()  //使用表单登录
            .loginPage("/login.html")  // 配置登录页为login.html
            .loginProcessingUrl("/mall/login") // 配置登录表单提交信息的路径
            .failureUrl("/login.html?error")  //配置登录失败时的页面
            .defaultSuccessUrl("/admin/Mall/indexMall.html")// 登录成功后的页面*
            .and()
            .logout()   //开始设置登出
            .logoutUrl("/logOut")  // 设置登出路径
            .logoutSuccessUrl("/login.html?logout"); // 设置登出成功后的页面


            //* defaultSuccessUrl设置的是默认登录成功的页面路径
            //  特指用户没有特定指向页面时登录成功才会显示的页面
            //  如果用户因为指向了特定页面而进入的登录页面,在登录成功之后
            //  会显示用户指向的特定页面
    }

}
